package commons.io;

import commons.data.Attributes;
import commons.data.Model;
import commons.data.Model.TypeField;
import commons.data.Zone;
import commons.params_appli.ParamsAppli;
import commons.utils.UtilsCalcul;
import commons.utils.UtilsFile;
import commons.utils.primitive_geom.Point_d;
import commons.utils.primitive_geom.Rect_d;
import commons.utils.primitive_geom.Segment_d;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;


// Fonctions d'export communes au LS et ANNO
public class CommonDataOutput {

	public static String getStringAttribute_03 (Attributes attr) {
		StringBuilder line = new StringBuilder(100);
		int nbField = attr.getModel().getNumberOfField();
		for (int i=0 ; i<nbField ; i++) {
			if (i>0) line.append("§");

			// ATTENTION : on recopie les attributs tels qu'ils ont été lus (stockés sous forme de chaine par AutoGene)
			// On ne tente pas de corriger un éventuel attribut type DBL avec une ","
			//  sinon il faudrait faire ce qui suit (en commentaire)
			// nouveauté v03 : séparateur décimal = "." mais on ne doit pas remplacer les éventuelles "," d'un champs type TXT texte !!
			// en fait, le fichier d'entrée est censé être correct

			//String value = attr.getValue(j);
			//if (attr.getType(j) == TypeField.DBL)
			//	value = value.replace(',', '.');
			//line += value;

			line.append(attr.getValue(i));
		}

		return line.toString();
	}


	// La balise [MODEL] a déjà été ecrite
	public static void writeModel_03 (ArrayList<String> vLines, Model model) {
		for (int i=0 ; i<model.getNumberOfField() ; i++) {
			String fieldName = model.getFieldName(i);
			TypeField fieldType = model.getTypeOf(i);
			int fieldSize = model.getSizeOf(i);

			vLines.add(fieldName + "§" + fieldType + "§" + fieldSize);
		}
	}

	public static void writeCoucheZones_v03(ArrayList<Zone> vZones, String nomSystProj, String chemin) {

		if (vZones.size()==1 && vZones.get(0).isZonePrincipale())
			return; // pas de zone spécifique -> on ne sauvegarde rien

		ArrayList<String> vLines = new ArrayList<String>();

		// Entête
		vLines.add("[VERSION FORMAT]");
		vLines.add("v03");
		vLines.add("[GEOM]");
		vLines.add("POLY");
		vLines.add("[PROJECTION]");
		vLines.add(nomSystProj);

		// Ecriture du modèle
		vLines.add("[MODEL]");
		vLines.add("NOM_ZONE§TXT§255");
		vLines.add("TYPE_ZONE§TXT§10");

		// Ecriture des données
		vLines.add("[DATA]");
		for (Zone zone : vZones) {

			// on ne sauvegarde pas la zone principale, qui a des coordonnées vides ...
			if (zone.isZonePrincipale()) continue;

			vLines.add(zone.name + "§" + zone.typeZone);
			if (zone.typeZone == Zone.TypeZone.RECT)
				writeRect_03(vLines, zone);
			else
				writeEllipse_03(vLines, zone);
		}

		// Ecriture dans le fichier
		String fileName = "zones" + "." + ParamsAppli.getParam("Common.EXTENSION_FICHIER_ECHANGE");
		UtilsFile.writeFile(chemin, fileName, vLines);
	}


	public static void writeSegment_03 (ArrayList<String> vLines, Segment_d seg) {
		String line = UtilsCalcul.round(seg.pt1.x,2) + "§" + UtilsCalcul.round(seg.pt1.y,2) + "§" +
					  UtilsCalcul.round(seg.pt2.x,2) + "§" + UtilsCalcul.round(seg.pt2.y,2);
		line = line.replace(',', '.'); // En v03, séparateur décimal = '.' obligatoirement
		vLines.add(line);
	}


	public static void writeRect_03 (ArrayList<String> vLines, Rect_d rect) {
		String line = UtilsCalcul.round(rect.xMin,2) + "§" + UtilsCalcul.round(rect.yMin,2) + "§" +
						UtilsCalcul.round(rect.xMin,2) + "§" + UtilsCalcul.round(rect.yMax,2) + "§" +
						UtilsCalcul.round(rect.xMax,2) + "§" + UtilsCalcul.round(rect.yMax,2) + "§" +
						UtilsCalcul.round(rect.xMax,2) + "§" + UtilsCalcul.round(rect.yMin,2);

		line = line.replace(',', '.'); // En v03, séparateur décimal = '.' obligatoirement
		vLines.add(line);
	}

	public static void writeEllipse_03 (ArrayList<String> vLines, Rect_d rect) {
		int NB_POINT_CERCLE = 200;
		// D'abord, on crée les points d'un cercle centré en 0 et de rayon 1
		ArrayList<Point_d> vPtCercle = new ArrayList<Point_d>();
		double angle = 0;
		for (int i = 0; i <NB_POINT_CERCLE ; i++) {
			vPtCercle.add(new Point_d(Math.cos(angle), Math.sin(angle)));
			angle += 2*Math.PI / NB_POINT_CERCLE;
		}

		// Puis on déforme ce cercle pour en faire une ellipse
		String line = "";
		Point_d ptCenter = rect.getCenter();
		double kx = rect.getWidth()/2;
		double ky = rect.getHeight()/2;
		for (Point_d pt : vPtCercle) {
			double x = pt.x * kx + ptCenter.x;
			double y = pt.y * ky + ptCenter.y;
			if (!line.isEmpty())
				line += "§";
			line += UtilsCalcul.round(x, 2) + "§" + UtilsCalcul.round(y, 2);
		}
		line = line.replace(',', '.'); // En v03, séparateur décimal = '.' obligatoirement

		vLines.add(line);
	}

	public static String nettoieCaractereSpeciaux(String fileName) {
		String fileNameNew = fileName;
		fileNameNew = fileNameNew.replace('é', 'e');
		fileNameNew = fileNameNew.replace('è', 'e');
		fileNameNew = fileNameNew.replace('ê', 'e');
		fileNameNew = fileNameNew.replace('ë', 'e');
		fileNameNew = fileNameNew.replace('à', 'a');
		fileNameNew = fileNameNew.replace('ä', 'a');
		fileNameNew = fileNameNew.replace('ù', 'u');
		fileNameNew = fileNameNew.replace('ü', 'u');
		fileNameNew = fileNameNew.replace('ï', 'i');
		fileNameNew = fileNameNew.replace('ç', 'c');
		
		fileNameNew = fileNameNew.replace(' ', '_');
		fileNameNew = fileNameNew.replace('\'', '_');
		fileNameNew = fileNameNew.replace('\"', '_');
		fileNameNew = fileNameNew.replace('°', '_');
		fileNameNew = fileNameNew.replace('-', '_');
		fileNameNew = fileNameNew.replace('+', '_');
		fileNameNew = fileNameNew.replace('(', '_');
		fileNameNew = fileNameNew.replace(')', '_');
		fileNameNew = fileNameNew.replace('[', '_');
		fileNameNew = fileNameNew.replace(']', '_');
		fileNameNew = fileNameNew.replace('{', '_');
		fileNameNew = fileNameNew.replace('}', '_');
		
		
		return fileNameNew;
	}


}
